package main

import (
	"fmt"
	"math"
)

// 题目：
//给你 n 个非负整数 a1，a2，...，an，每个数代表坐标中的一个点(i,ai) 。在坐标内画 n 条垂直线，垂直线 i的两个端点分别为(i ai) 和 (i, 0) 。找出其中的两条线，使得它们与x轴共同构成的容器可以容纳最多的水。
//来源：力扣（LeetCode）
//链接：https://leetcode-cn.com/problems/container-with-most-water
//著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
// 思路： 中等题目类型
// 暴力破解，遍历方式
// 把自己作为最低的那一边,然后找到最大值,遍历所有柱子
// 找到所有 所有柱子中最大的即可

/*func maxArea(height []int) int {
	//max := make([]int,len(height))
	max := 0
	for i, val := range height {
		for j := i; j < len(height); j++ {
			width := math.Abs(float64(i - j))
			tmp := int(width) * int( math.Min(float64(val),float64(height[j])))
			if tmp > max {
				max = tmp
			}
		}
	}
	return max
}*/
//	 双指针法的优化方法 :https://leetcode-cn.com/problems/container-with-most-water/solution/shuang-zhi-zhen-fa-zheng-ming-jian-dan-yi-dong-bu-/
//   双指针法，其实是，在减少宽度的情况下，每一个矮柱子和其他柱子的最大值；
//   本质：双指针法的本质是 根据两层循环之间 隐含的数量关系 转化成单层的循环方式

func maxArea(height []int) int {
	i:=0
	j:= len(height) -1
	max :=0
	var tmp float64
	for ;i < j ; {
		tmp = math.Min(float64(height[i]),float64(height[j])) * float64(j-i)  // 在go 中使用min 不要使用尽量自己写比较函数比较好
	  if int(tmp) > max {
	  	max = int(tmp)
	  }
	  if height[i] > height[j] {
	  	j--
	  }else {
	  	i++
	  }
	}
	return max
}

func main() {
	//height:=make([]int,9)

	//var height =[...]int{1,8,6,2,5,4,8,3,7} // 这是创建了一个数组 ，而不是切片

	var height = []int{1,8,6,2,5,4,8,3,7} // 创建了一个切片
	fmt.Println(maxArea(height))

}
